<?php

namespace App\Miya\UIData;

use App\Miya\Models\Module;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\ModelNotFoundException;

class ModuleData extends CommonData
{
    protected $name = 'module';
    protected $fields = ['id', 'name', 'tag', 'avatar', 'module_extends'];

    /**
     * 通过tag获取模块信息
     * @param $tag 模块tag
     *
     * @operate 直接调用
     *
     * @data id 模块id
     * @data name 模块名称
     * @data tag 模块tag
     * @data avatar 模块封面
     * @data module_extends 模块拓展信息
     * @data url() 模块超链接  传入false 为模块展示页超链接
     */
    public function getByTag($tag): Module
    {
        return $this->dataCache(function () use ($tag) {
            $module = Module::whereTag($tag)->select($this->fields)->first();

            if (!$module) {
                $msg = sprintf('模块中为找到tag为 %s 的数据信息', $tag);
                throw new ModelNotFoundException($msg);
            }
            $module->avatar && $module->avatar = asset('uploads/' . $module->avatar);

            return $module;
        }, __METHOD__, $tag);
    }

    /**
     * 通过id获取模块信息
     * @param $id 模块id
     *
     * @operate 直接调用
     *
     * @data id 模块id
     * @data name 模块名称
     * @data tag 模块tag
     * @data avatar 模块封面
     * @data module_extends 模块拓展信息
     * @data url() 模块超链接  传入false 为模块展示页超链接
     */
    public function get($id): Module
    {
        return $this->dataCache(function () use ($id) {
            $module = Module::select($this->fields)->find($id);

            if (!$module) {
                $msg = sprintf('模块中为找到id为 %s 的数据信息', $id);
                throw new ModelNotFoundException($msg);
            }
            $module->avatar && $module->avatar = asset('uploads/' . $module->avatar);
            return $module;
        }, __METHOD__, $id);
    }

    /**
     * 通过模块标签得到模块下分类信息
     * @param $moduleTag 模块标签
     *
     * @operate 遍历后调用
     *
     * @data id 分类id
     * @data name 分类名称
     * @data avatar 分类封面
     * @data keyword 分类关键词 id:关键词id keyword:关键词
     * @data tag 分类Tag
     * @data extends 分类拓展信息
     * @data url() 分类超链接
     */
    public function classifiesByTag($moduleTag): Collection
    {
        return $this->dataCache(function () use ($moduleTag) {
            $module = Module::whereTag($moduleTag)
                ->with(['classifies' => function ($query) {
                    $query->where('status', 1);
                    $query->orderBy('rank');
                }, 'classifies.module', 'classifies.keyword:id,keyword'])->first();
            if (!$module) {
                $msg = sprintf('模块中为找到tag为 %s 的数据信息', $moduleTag);
                throw new ModelNotFoundException($msg);
            }

            return $this->parseClassifyData($module);
        }, __METHOD__, $moduleTag);
    }

    /**
     * 通过模块标签得到模块下分类分析
     * @param $moduleId 模块Id
     *
     * @operate 遍历后调用
     *
     * @data id 分类id
     * @data name 分类名称
     * @data avatar 分类封面
     * @data keyword 分类关键词 id:关键词id keyword:关键词
     * @data tag 分类Tag
     * @data extends 分类拓展信息
     * @data url() 分类超链接
     */
    public function classifies($moduleId): Collection
    {
        return $this->dataCache(function () use ($moduleId) {
            $module = Module::with(['classifies' => function ($query) {
                $query->where('status', 1);
                $query->orderBy('rank');
            }, 'classifies.module', 'classifies.keyword:id,keyword'])
                ->find($moduleId);
            if (!$module) {
                $msg = sprintf('模块中为找到id为 %s 的数据信息', $moduleId);
                throw new ModelNotFoundException($msg);
            }

            return $this->parseClassifyData($module);
        }, __METHOD__, $moduleId);
    }

    /**
     * 通过模块tag得到模块的属性数据
     * @param $moduleTag 模块tag
     *
     * @operate 遍历后调用
     *
     * @data name 属性名称
     * @data values 属性可选值数据
     */
    public function typesByTag($moduleTag)
    {
        return $this->dataCache(function () use ($moduleTag) {
            $module = Module::whereTag($moduleTag)
                ->with(['types:id,module_id,name,values'])->first();
            if (!$module) {
                $msg = sprintf('模块中为找到tag为 %s 的数据信息', $moduleTag);
                throw new ModelNotFoundException($msg);
            }

            return $module->types;
        }, __METHOD__, $moduleTag);
    }

    /**
     * 格式化分类数据
     * @param $module
     * @return Collection
     */
    protected function parseClassifyData($module): Collection
    {
        $classifies = $module->classifies->map(function ($classify) {
            $classify->avatar && $classify->avatar = asset('uploads/' . $classify->avatar);
            return $classify;
        })->toTree();
        return $classifies;
    }
}
